Klasický dataset 20 newsgroups je distribuován v modulu sklearn.datesets. Jde o cca 20K krátkých zpráv, které si vyměňovali uživatelé Usenetu (tj. někdy v 90. letech). Zprávy pocházejí rovnoměrně z 20 kanálů.
Funkce rovnou umožňuje smazat různé technické části zpráv, které nás nezajímají. Nakonec z objektu vybereme pouze data.
newsgroups_raw <- sklearn_datasets$fetch_20newsgroups(subset ="all",remove =tuple("headers", "footers", "quotes"))# data samotná jsou ještě o úroveň nížed_newsgroups <- newsgroups_raw[["data"]]
Trénujeme model
Získáme zvlášť embeddings.
# na Apple Silicon strojích chceme využít "grafickou kartu"st_device <-NULLif (version$platform =="aarch64-apple-darwin20") { st_device <-"mps"}# definujeme modelembedding_model <- st$SentenceTransformer("all-MiniLM-L6-v2", device = st_device)# spočítáme embeddings, pokud už je nemámeif (file.exists(here("data/embeddings/newsgroups.rds"))) { embeddings <-read_rds(here("data/embeddings/newsgroups.rds"))} else { embeddings <- embedding_model$encode(d_newsgroups, show_progress_bar =TRUE)}
Základní přehled témat, počtů příslušných dokumentů a shrnutí clusterů získáte skrze:
# náhled omezíme jen na 5 prvních témat a z plných ukázek reprezentativních dokumentů# uděláme úryvky o 100 znacích (vše kvůli renderování reportu, pro práci v RStudiu# není třeba)topic_model$get_topic_info() |>head() |>mutate(Representative_Docs =map(Representative_Docs, \(x) str_trunc(x, 100)))
Nejvíce zastoupené téma je pod indexem 0. Podrobnosti o tématu získáme příkazem níže. Výstupem jsou slova s nejvyšší c-TF-IDF hodnotou, zobrazenou u každého slova. c-TF-IDF je TF-IDF fungující ne na úrovni dokumentů, ale clusterů. Říká, jaká slova jsou nejvíce relevantní pro dané téma; vychází ze “slepence” dokumentů v rámci clusteru.